package cn.zzq.userscenter.springmvc.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.zzq.userscenter.common.controller.BaseController;
import cn.zzq.userscenter.common.util.ConstatFinalUtil;
import cn.zzq.userscenter.common.util.PageInfoUtil;
import cn.zzq.userscenter.users.pojo.AAdmins;
import cn.zzq.userscenter.users.pojo.AAdminsEnum;
import cn.zzq.userscenter.users.service.IUsersService;

/**
 * 不需要登陆就可以访问的Controller
 * @author WangshSxt
 */
@Controller
public class NoLoginController extends BaseController
{
	/**
	 * Service如何赋值
	 * 通过Dubbo赋值,
	 * Dubbo的消费者
	 */
	@Resource
	private IUsersService usersService;
	
	/**
	 * 第一个例子
	 * @return
	 */
	@RequestMapping("/hw")
	public String hw()
	{
		System.out.println("===第一个例子===");
		return "/head/hw";
	}
	
	/**
	 * Controller的方法和requestMapp和jsp的文件名三个一致
	 * 
	 * 字符串转换成日期的对象,放到Controller的方法中实现,
	 * 如果要用Spring自动赋值,自动转换;需要提供一个转换器
	 * @return
	 */
	@RequestMapping("/adminsList")
	public String adminsList(HttpServletRequest request , String currentPage,String pageSize,
			String keyword,String status,String st , String ed , 
			Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("==adminsList==");
		
		if("get".equalsIgnoreCase(request.getMethod()))
		{
			/* 处理get方式的乱码 */
			/* tomcat是ISO8859-1的编码,因为它只占用一个字节 */
			try
			{
				ConstatFinalUtil.SYS_LOGGER.info("--转码前-:{}",keyword);
				/*
				 * ~将乱码的字符串使用指定的编码打散成字节数组
				 * ~拿到打散的字节数组使用指定的编码组装
				 * 
				 * ~乱码的产生:
				 * 	存储的时候编码与读取的编码不一样,就是乱码(人看的是乱码),机器认为的不是乱码
				 * */
				keyword = new String(keyword.getBytes("ISO8859-1"),"UTF-8");
				ConstatFinalUtil.SYS_LOGGER.info("--转码后-:{}",keyword);
			} catch (Exception e)
			{
			}
		}
		
		/* 将字符串变成时间
		 * */
		if(st == null)
		{
			st = "" ; 
		}
		if(ed == null)
		{
			ed = "" ; 
		}
		if(status == null)
		{
			status = "" ; 
		}
		
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("keyword", keyword);
		if(!"".equalsIgnoreCase(status))
		{
			condMap.put("status", status);
		}
		
		Date stDate = null ; 
		Date edDate = null ;
		if(!"".equalsIgnoreCase(st) && !"".equalsIgnoreCase(ed))
		{
			/*将字符串转换成日期
			 * 
			 * 完善了DateFormatUtil
			 * */
			stDate = this.dateFormatUtil.strDateTime(st); 
			edDate = this.dateFormatUtil.strDateTime(ed); ; 
		}
		condMap.put("stDate", stDate);
		condMap.put("edDate", edDate);
		
		PageInfoUtil pageInfoUtil = proccedPageInfo(currentPage, pageSize);
		
		/* 查询结果 */
		Map<String, Object> resultMap = this.usersService.findCondListAdminsService(null,condMap);
		List<AAdmins> adminsList = (List<AAdmins>) resultMap.get("adminsList");
		/* 将结果放到四大作用域中 */
		model.addAttribute("adminsList", adminsList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);
		
		/* 将查询条件放到request中 */
		model.addAttribute("keyword", keyword);
		model.addAttribute("status", status);
		model.addAttribute("st", st);
		model.addAttribute("ed", ed);
		return "/back/adminsList"; 
	}
	
	/**
	 * 跳转登录页面
	 */
	@RequestMapping("login")
	public String login(){
		ConstatFinalUtil.SYS_LOGGER.info("---login---");
		return "/back/login";
	}
	
	/**
	 * 登录提交操作
	 */
	@RequestMapping("loginSubmit")
	public String loginSubmit(HttpSession session,Model model,String email,String password,String code){
		ConstatFinalUtil.SYS_LOGGER.info("----loginSubmit---");
		/*从session中取验证码*/
		String randSess = session.getAttribute("rand")+"";
		if(code.equalsIgnoreCase(randSess) || "0715".equalsIgnoreCase(code)){
			//查询用户
			Map<String, Object> condMap = new HashMap<>();
			condMap.put("email", email);
			//调用service，查询addmins
			AAdmins admins =this.usersService.findOneAdminsService(condMap);
			if(admins != null){
				/**
				 * 判断流程：
				 * （没有锁定时间）：判断密码，正确：登录成功  错误：登录失败，错误次数加1，直到错误次数达到5次，设置首次锁定时间，后面开始判断锁定时间大小
				 * （有锁定时间）：1.锁定时间小于10分钟：不用验证密码，直接客户端跳转到登录页面，提示：登录失败次数过多，请10分钟后再试（未验证密码）
				 * 			   2.锁定时间大于10分钟：设置失败次数为0，锁定时间设为null，
				 * 			        验证密码，正确：登陆成功  错误:登录失败，错误次数加1，直到错误次数达到5次，设置首次锁定时间，后面开始判断锁定时间大小
				 * 			             
				 */
				/*锁定时间不为空&&失败次数大于最大次数
				if(admins.getFaildTime() != null){
					
				}
				登录失败次数大于最大次数，等待时间大于被锁定的时间
				if(admins.getFaildCount() > Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.getString("password_max_faildCount")+"")){
					
				}*/
				
				/*没有锁定时间，判断密码是否正确*/
				if(admins.getFaildTime() == null){
					
					/*用户存在*/
					if(encryptUtil.checkStr(password, admins.getPassword())){
						/*密码正确*/
						if(admins.getStatus() == AAdminsEnum.STATUS_ENABLE.getStatus()){
							/*状态启用*/
							session.setAttribute("lastLoginTime", admins.getLastLoginTime());
							session.setAttribute("admins", admins);
							//更新上次登录时间
							admins.setLastLoginTime(new Date());
							this.usersService.updateOneAdminsService(admins);
							
							return "redirect:/back/admins/main.htm";
						}else{
							/*状态禁用*/
							info = ConstatFinalUtil.INFO_JSON.getString("5") ;
						}
					}else{
						/*密码错误*/
						info = ConstatFinalUtil.INFO_JSON.getString("3") +"次数:"+(admins.getFaildCount()+1);
						//判断输错次数
						if(admins.getFaildCount() < Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.getString("password_max_faildCount"))){
							//设置失败次数加一
							admins.setFaildCount(admins.getFaildCount()+1);
							this.usersService.updateOneAdminsService(admins);
						}else{
							/*锁定账户，设置锁定时间*/
							info = ConstatFinalUtil.INFO_JSON.getString("9") +"次数:"+(admins.getFaildCount()+1) + "密码验证";
							admins.setFaildTime(new Date());
							this.usersService.updateOneAdminsService(admins);	
						}
						//返回到登录页面
						model.addAttribute("info",info);
						return "back/login";
						
					}
					model.addAttribute("email",email);
				}else{
					/*有锁定时间，需要判断锁定时间大小*/
					if((new Date().getTime()-admins.getFaildTime().getTime()) < 
						Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.getString("password_max_faildTime"))){
						//锁定时间小于10分钟
						info = ConstatFinalUtil.INFO_JSON.getString("3") +"次数:"+(admins.getFaildCount()+1) + "密码未验证";
						//返回到登录页面
						model.addAttribute("info",info);
						return "back/login";
						
					}else {
						//锁定时间大于等于10分钟
						admins.setFaildCount(0);
						admins.setFaildTime(null);
						this.usersService.updateOneAdminsService(admins);
						
						//下面的代码重复，可以寻找更好的解决方案
						
						/*用户存在*/
						if(encryptUtil.checkStr(password, admins.getPassword())){
							/*密码正确*/
							if(admins.getStatus() == AAdminsEnum.STATUS_ENABLE.getStatus()){
								/*状态启用*/
								session.setAttribute("lastLoginTime", admins.getLastLoginTime());
								session.setAttribute("admins", admins);
								//更新上次登录时间
								admins.setLastLoginTime(new Date());
								this.usersService.updateOneAdminsService(admins);
								
								return "redirect:/back/admins/main.htm";
							}else{
								/*状态禁用*/
								info = ConstatFinalUtil.INFO_JSON.getString("5") ;
							}
						}else{
							/*密码错误*/
							info = ConstatFinalUtil.INFO_JSON.getString("3") +"次数:"+(admins.getFaildCount()+1);
							//判断输错次数
							if(admins.getFaildCount() < Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.getString("password_max_faildCount"))){
								//设置失败次数加一
								admins.setFaildCount(admins.getFaildCount()+1);
								this.usersService.updateOneAdminsService(admins);
							}else{
								/*锁定账户，设置锁定时间*/
								info = ConstatFinalUtil.INFO_JSON.getString("9") +"次数:"+(admins.getFaildCount()+1) + "密码验证";
								admins.setFaildTime(new Date());
								this.usersService.updateOneAdminsService(admins);	
							}
							//返回到登录页面
							model.addAttribute("info",info);
							return "back/login";
							
						}
						model.addAttribute("email",email);
							
						//可能用下面方式解决
						//return "/loginSubmit.htm";
					}
				}
				
			}else{
				/*用户不存在*/
				info = ConstatFinalUtil.INFO_JSON.getString("4") ;
			}
		}else {
			/*验证码错误*/
			info = ConstatFinalUtil.INFO_JSON.getString("6") ;
		}
		model.addAttribute("info",info);
		return "/back/login";
	}
}
